Skip to content

feat(webshop): add print & pixel size support (feature 043)#4388

Merged
ildyria merged 25 commits into
masterfrom
copilot/feature-43-add-print-and-pixel-size-support
Jun 11, 2026
Merged

feat(webshop): add print & pixel size support (feature 043)#4388
ildyria merged 25 commits into
masterfrom
copilot/feature-43-add-print-and-pixel-size-support

Conversation

Copilot AI commented May 31, 2026

Copy link
Copy Markdown
Contributor

Implements feature 043: webshop support for physical print sizes and pixel-dimension downloads, including per-purchasable price assignments, admin catalogue management, basket/checkout flow with shipping address, and full i18n coverage.

Backend

  • Eager loading fix: PurchasablePrintSize and PurchasablePixelSize now declare protected $with = ['printSize'] / protected $with = ['pixelSize'] to prevent LazyLoadingViolationException (enforced globally via Model::shouldBeStrict())
  • New types in lychee.d.ts: PrintSizeResource, PixelSizeResource, PurchasablePrintSizeResource, PurchasablePixelSizeResource, CatalogueSizesResource; added is_print: boolean to OrderItemResource

Tests

  • CanProcessPaymentPrintTest — verifies Order::canProcessPayment() returns false when a print item is present but shipping address fields are missing (city, post code, country)
  • PurchasableLicenseTypeTest — verifies the PRINT enum case exists and is distinct

Frontend services

  • shop-management-service.ts: CRUD methods for global print/pixel size catalogue (listPrintSizes, createPrintSize, updatePrintSize, deletePrintSize, and pixel equivalents); updatePurchasablePrices for per-purchasable assignments
  • webshop-service.ts: getCatalogueSizes, addPrintPhotoToBasket, addPixelPhotoToBasket; shipping fields on CreateCheckout
  • OrderManagement store: addPrintPhoto, addPixelPhoto actions; hasPrintItems getter

Frontend UI

  • PrintPixelSizesAdmin.vue: Admin DataTable page at /admin/shop/sizes for managing the global size catalogue (create/edit/delete for both print and pixel sizes)
  • BuyMeDialog.vue / buyMeActions.ts: Tabbed item-type selector (Digital / Print / Pixel); fetches available sizes via getCatalogueSizes
  • AlbumPurchasable.vue: Integrates PrintSizePricesInput and PixelSizePricesInput components; "Update" now calls updatePurchasablePrices
  • Checkout flow: Shipping address block in InfoSection.vue (shown when hasPrintItems); shipping refs collected in useStepOne, passed through useStepTwo to createSession

i18n

New translation groups added to lang/en/webshop.php (buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress) and lang/en/left-menu.php (shopSizes), with English-placeholder entries propagated to all 22 non-English locales.

Summary by CodeRabbit

  • New Features

    • Admins: full print & pixel size catalogue + management UI.
    • Customers: buy physical prints and custom pixel-size downloads with per-size pricing.
    • Basket/checkout: add print/pixel items, collect optional shipping address; orders show shipping + per-item size metadata.
    • Catalog endpoint surfaces available sizes/prices per product; frontend translations and admin routes added.
  • Documentation

    • Feature plan and specification for webshop print/pixel sizes.
  • Tests

    • Extensive unit and feature tests covering pricing, basket, checkout shipping and catalogue endpoints.

Copilot AI and others added 5 commits May 31, 2026 10:32
Co-authored-by: ildyria <627094+ildyria@users.noreply.github.com>
…for webshop print & pixel sizes

Co-authored-by: ildyria <627094+ildyria@users.noreply.github.com>
Co-authored-by: ildyria <627094+ildyria@users.noreply.github.com>
Co-authored-by: ildyria <627094+ildyria@users.noreply.github.com>
…h comment

Co-authored-by: ildyria <627094+ildyria@users.noreply.github.com>
…pixel sizes

Co-authored-by: ildyria <627094+ildyria@users.noreply.github.com>
Copilot AI changed the title Implementing print and pixel size support for webshop feat(webshop): add print & pixel size support (feature 043) Jun 4, 2026
Copilot AI requested a review from ildyria June 4, 2026 22:12
@codecov

codecov Bot commented Jun 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 93.48659% with 34 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.42%. Comparing base (034738a) to head (0192875).
⚠️ Report is 2 commits behind head on master.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ildyria ildyria marked this pull request as ready for review June 11, 2026 16:46
@ildyria ildyria requested a review from a team as a code owner June 11, 2026 16:46
@ildyria

ildyria commented Jun 11, 2026

Copy link
Copy Markdown
Member

@coderabbitai do your thing.

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

@ildyria, on it — I’ll review the PR changes now.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 26eee692-718d-495d-b4f4-56f38f5ee3a2

📥 Commits

Reviewing files that changed from the base of the PR and between a17024f and 0192875.

📒 Files selected for processing (10)
  • app/Actions/Shop/PurchasableService.php
  • app/Http/Controllers/Admin/PixelSizeManagementController.php
  • app/Http/Controllers/Admin/PrintSizeManagementController.php
  • app/Http/Requests/Checkout/CreateSessionRequest.php
  • app/Http/Requests/ShopManagement/PixelSize/DeletePixelSizeRequest.php
  • app/Http/Requests/ShopManagement/PrintSize/DeletePrintSizeRequest.php
  • app/Http/Requests/ShopManagement/PurchasableAlbumRequest.php
  • docs/specs/4-architecture/open-questions.md
  • resources/js/components/forms/shop-management/PixelSizeFormDialog.vue
  • resources/js/views/admin/shop/PrintPixelSizesAdmin.vue
💤 Files with no reviewable changes (1)
  • docs/specs/4-architecture/open-questions.md
🚧 Files skipped from review as they are similar to previous changes (6)
  • resources/js/views/admin/shop/PrintPixelSizesAdmin.vue
  • resources/js/components/forms/shop-management/PixelSizeFormDialog.vue
  • app/Http/Controllers/Admin/PrintSizeManagementController.php
  • app/Http/Controllers/Admin/PixelSizeManagementController.php
  • app/Http/Requests/ShopManagement/PixelSize/DeletePixelSizeRequest.php
  • app/Http/Requests/ShopManagement/PurchasableAlbumRequest.php

📝 Walkthrough

Walkthrough

Adds global print and pixel size catalogues, per-purchasable size pricing, basket/order support for print/pixel items, admin CRUD and frontend UI, translations, docs, migrations, and tests.

Changes

Webshop print and pixel sizes

Layer / File(s) Summary
Core feature implementation
app/Models/*, app/Actions/*, app/Http/*, app/DTO/*, app/Enum/*, database/migrations/*, database/factories/*, resources/js/*, routes/*, tests/*
Introduces print/pixel size models and join models, migrations, DTOs, enum case, services to sync sizes, order/basket methods for adding size items, admin CRUD controllers/requests/resources, frontend components, API routes, and broad test coverage.
Docs and planning
docs/specs/...
Adds feature plan, spec, tasks checklist, roadmap entry, and open-questions updates documenting the end-to-end feature.
Translations and menu entries
lang/*
Adds left-menu entries and many webshop UI translation keys for print/pixel, size catalogue, price inputs, and shipping address fields across locales.
Frontend flows and routes
resources/js/..., resources/sass/app.css, resources/js/lychee.d.ts, routes/*
Updates services, composables, stores, Vue components, admin view, TypeScript declarations, and routing to support size catalogue, buy-me flows, checkout shipping fields, and admin pages.
Tests
tests/*
Adds and updates unit and feature tests for enum, purchasable size syncing, order service additions, basket endpoints, checkout shipping persistence, admin controllers, and resource output.
Infra
Dockerfile, phpstan.neon
Pins a new FrankenPHP production image digest and adds a PHPStan ignore rule.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Poem

🐇 I hopped through code with a tiny bell,
Sizes and pixels now fit in my shell.
Admins can add, and buyers can choose,
Prints and downloads — no rabbit will lose.
✨📦

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

🧹 Nitpick comments (23)
lang/es/left-menu.php (1)

27-27: ⚡ Quick win

English placeholder should be translated to Spanish.

The shopSizes key currently uses the English text "Size Catalogue" instead of a Spanish translation (e.g., "Catálogo de Tamaños"). While English placeholders are acceptable for the initial rollout, consider translating to Spanish in a follow-up.

lang/es/webshop.php (1)

36-38: ⚡ Quick win

Complete Spanish translations for remaining English placeholders.

Several keys have Spanish translations (lines 81, 84-85), but many remain in English (basketList additions, buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress sections). Consider completing the Spanish translations in a follow-up for consistency.

Also applies to: 235-279

lang/fa/left-menu.php (1)

28-28: ⚡ Quick win

English placeholder should be translated to Persian.

The shopSizes key uses English text instead of Persian (Farsi) translation. Consider translating to Persian in a follow-up for consistency with the locale.

lang/fa/webshop.php (1)

36-38: ⚡ Quick win

Complete Persian translations for remaining English placeholders.

Several keys have Persian translations (lines 81, 84-85), but many remain in English (basketList additions, buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress sections). Consider completing the Persian translations in a follow-up for consistency.

Also applies to: 235-279

lang/fr/left-menu.php (1)

28-28: ⚡ Quick win

English placeholder should be translated to French.

The shopSizes key uses English text instead of a French translation (e.g., "Catalogue de Tailles"). Consider translating to French in a follow-up for consistency with the locale.

lang/fr/webshop.php (1)

36-38: ⚡ Quick win

Complete French translations for remaining English placeholders.

Several keys have French translations (lines 81, 84-85), but many remain in English (basketList additions, buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress sections). Consider completing the French translations in a follow-up for consistency.

Also applies to: 235-279

lang/hu/left-menu.php (1)

28-28: ⚡ Quick win

English placeholder should be translated to Hungarian.

The shopSizes key uses English text instead of a Hungarian translation (e.g., "Méret Katalógus"). Consider translating to Hungarian in a follow-up for consistency with the locale.

lang/no/webshop.php (1)

235-279: ⚡ Quick win

Complete Norwegian translations for new webshop sections.

The new translation groups (buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress) contain English placeholder strings rather than Norwegian translations. While lines 81, 84-85 correctly provide Norwegian text, these larger sections remain untranslated.

For a Norwegian locale file, users expect Norwegian strings throughout.

lang/pl/left-menu.php (1)

28-28: ⚡ Quick win

Translate 'Size Catalogue' to Polish.

The value for shopSizes is in English. Polish locale files should provide Polish translations.

lang/pl/webshop.php (1)

235-279: ⚡ Quick win

Complete Polish translations for new webshop sections.

The new translation groups (buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress) contain English placeholder strings. Lines 81, 84-85 correctly provide Polish text, but these sections remain untranslated.

lang/pt/left-menu.php (1)

28-28: ⚡ Quick win

Translate 'Size Catalogue' to Portuguese.

The value for shopSizes is in English. Portuguese locale files should provide Portuguese translations.

lang/pt/webshop.php (1)

235-279: ⚡ Quick win

Complete Portuguese translations for new webshop sections.

The new translation groups (buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress) contain English placeholder strings. Lines 81, 84-85 correctly provide Portuguese text, but these sections remain untranslated.

lang/ru/left-menu.php (1)

28-28: ⚡ Quick win

Translate 'Size Catalogue' to Russian.

The value for shopSizes is in English. Russian locale files should provide Russian translations.

lang/ru/webshop.php (1)

235-279: ⚡ Quick win

Complete Russian translations for new webshop sections.

The new translation groups (buyMeDialog, sizeCatalogue, printSizePricesInput, pixelSizePricesInput, shippingAddress) contain English placeholder strings. Lines 81, 84-85 correctly provide Russian text, but these sections remain untranslated.

lang/sk/left-menu.php (1)

28-28: ⚡ Quick win

Translate 'Size Catalogue' to Slovak.

The value for shopSizes is in English. Slovak locale files should provide Slovak translations.

app/Http/Controllers/Admin/PrintSizeManagementController.php (1)

31-31: ⚡ Quick win

Remove redundant ->all() call.

PrintSize::all() already returns a Collection. The chained ->all() converts it to a plain array, but then PrintSizeResource::collect() expects a collection or array. The double ->all() is redundant; use PrintSize::all() directly.

♻️ Proposed fix
-		return PrintSizeResource::collect(PrintSize::all()->all());
+		return PrintSizeResource::collect(PrintSize::all());
app/Http/Controllers/Shop/CheckoutController.php (1)

70-88: ⚖️ Poor tradeoff

Consider refactoring repetitive null checks.

The six shipping address fields follow an identical pattern. While explicit and clear, this could be refactored to reduce duplication.

♻️ Optional refactor to reduce duplication
-		// Store shipping address if provided
-		if ($request->shipping_street_name !== null) {
-			$order->shipping_street_name = $request->shipping_street_name;
-		}
-		if ($request->shipping_street_number !== null) {
-			$order->shipping_street_number = $request->shipping_street_number;
-		}
-		if ($request->shipping_additional_info !== null) {
-			$order->shipping_additional_info = $request->shipping_additional_info;
-		}
-		if ($request->shipping_city !== null) {
-			$order->shipping_city = $request->shipping_city;
-		}
-		if ($request->shipping_post_code !== null) {
-			$order->shipping_post_code = $request->shipping_post_code;
-		}
-		if ($request->shipping_country !== null) {
-			$order->shipping_country = $request->shipping_country;
-		}
+		// Store shipping address if provided
+		foreach (['shipping_street_name', 'shipping_street_number', 'shipping_additional_info', 
+		          'shipping_city', 'shipping_post_code', 'shipping_country'] as $field) {
+			if ($request->$field !== null) {
+				$order->$field = $request->$field;
+			}
+		}
database/migrations/2026_05_31_000006_extend_orders_for_shipping.php (1)

20-25: ⚖️ Poor tradeoff

Consider specifying explicit lengths for shipping address fields.

While Laravel's default varchar(255) works, explicit lengths would better express intent:

  • shipping_post_code: typically 10-20 chars max
  • shipping_country: could use 2 chars for ISO codes or 100 for full names
  • Street/city fields: 255 is reasonable
♻️ Optional refinement with explicit lengths
 		Schema::table('orders', function (Blueprint $table) {
-			$table->string('shipping_street_name')->nullable()->after('comment');
-			$table->string('shipping_street_number')->nullable()->after('shipping_street_name');
+			$table->string('shipping_street_name', 255)->nullable()->after('comment');
+			$table->string('shipping_street_number', 50)->nullable()->after('shipping_street_name');
 			$table->string('shipping_additional_info')->nullable()->after('shipping_street_number');
-			$table->string('shipping_city')->nullable()->after('shipping_additional_info');
-			$table->string('shipping_post_code')->nullable()->after('shipping_city');
-			$table->string('shipping_country')->nullable()->after('shipping_post_code');
+			$table->string('shipping_city', 255)->nullable()->after('shipping_additional_info');
+			$table->string('shipping_post_code', 20)->nullable()->after('shipping_city');
+			$table->string('shipping_country', 100)->nullable()->after('shipping_post_code');
 		});
resources/js/components/forms/shop-management/PixelSizePricesInput.vue (2)

43-48: ⚡ Quick win

Consolidate Vue imports to eliminate duplication.

The watch function is imported separately on line 48, but it should be imported alongside onMounted and ref on line 43.

♻️ Consolidate imports
-import { onMounted, ref } from "vue";
+import { onMounted, ref, watch } from "vue";
 import InputCurrency from "`@/components/forms/basic/InputCurrency.vue`";
 import ShopManagementService from "`@/services/shop-management-service`";
 import { useShopManagementStore } from "`@/stores/ShopManagement`";
 import { storeToRefs } from "pinia";
-import { watch } from "vue";

65-65: ⚡ Quick win

Compute default item dynamically to avoid stale pricing.

The _defaultItem constant captures default_price_cents.value once at component definition. If the store's default_price_cents changes after the component mounts, newly added rows will still use the stale initial value.

♻️ Compute default item dynamically
-const _defaultItem: PixelSizeAssignment = { pixel_size_id: 0, price: default_price_cents.value, license_type: "personal" };
+function createDefaultItem(): PixelSizeAssignment {
+	return { pixel_size_id: 0, price: default_price_cents.value, license_type: "personal" };
+}

Then update line 34:

-	`@click`="items.push({ ..._defaultItem })"
+	`@click`="items.push(createDefaultItem())"
resources/js/components/forms/shop-management/PrintSizePricesInput.vue (2)

40-44: ⚡ Quick win

Consolidate Vue imports to eliminate duplication.

The watch function is imported separately on line 74, but it should be imported alongside onMounted and ref on line 40.

♻️ Consolidate imports
-import { onMounted, ref } from "vue";
+import { onMounted, ref, watch } from "vue";
 import InputCurrency from "`@/components/forms/basic/InputCurrency.vue`";
 import ShopManagementService from "`@/services/shop-management-service`";
 import { useShopManagementStore } from "`@/stores/ShopManagement`";
 import { storeToRefs } from "pinia";
 
 // ... later in file
-import { watch } from "vue";
 watch(

Also applies to: 74-74


60-60: ⚡ Quick win

Compute default item dynamically to avoid stale pricing.

The _defaultItem constant captures default_price_cents.value once at component definition. If the store's default_price_cents changes after the component mounts, newly added rows will still use the stale initial value.

♻️ Compute default item dynamically
-const _defaultItem: PrintSizeAssignment = { print_size_id: 0, price: default_price_cents.value };
+function createDefaultItem(): PrintSizeAssignment {
+	return { print_size_id: 0, price: default_price_cents.value };
+}

Then update line 31:

-	`@click`="items.push({ ..._defaultItem })"
+	`@click`="items.push(createDefaultItem())"
tests/Unit/Actions/Shop/PurchasableSyncSizesTest.php (1)

196-196: ⚡ Quick win

Prefer strict identity assertions for ID checks.

Use assertSame() instead of assertEquals() for IDs to keep strict-comparison semantics in tests.

As per coding guidelines, PHP code should "Use strict comparison (===) instead of loose comparison (==)".

Also applies to: 203-203

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 833a0a99-a478-4e8f-8318-28f171a35bb5

📥 Commits

Reviewing files that changed from the base of the PR and between 034738a and a17024f.

📒 Files selected for processing (146)
  • Dockerfile
  • app/Actions/Shop/BasketService.php
  • app/Actions/Shop/OrderService.php
  • app/Actions/Shop/PurchasableService.php
  • app/Contracts/Http/Requests/RequestAttribute.php
  • app/DTO/PixelSizeAssignment.php
  • app/DTO/PrintSizeAssignment.php
  • app/Enum/PurchasableLicenseType.php
  • app/Http/Controllers/Admin/PixelSizeManagementController.php
  • app/Http/Controllers/Admin/PrintSizeManagementController.php
  • app/Http/Controllers/Admin/ShopManagementController.php
  • app/Http/Controllers/Shop/BasketController.php
  • app/Http/Controllers/Shop/CatalogueSizesController.php
  • app/Http/Controllers/Shop/CheckoutController.php
  • app/Http/Requests/Basket/AddPixelItemRequest.php
  • app/Http/Requests/Basket/AddPrintItemRequest.php
  • app/Http/Requests/Catalog/GetCatalogueSizesRequest.php
  • app/Http/Requests/Checkout/CreateSessionRequest.php
  • app/Http/Requests/ShopManagement/PixelSize/CreatePixelSizeRequest.php
  • app/Http/Requests/ShopManagement/PixelSize/DeletePixelSizeRequest.php
  • app/Http/Requests/ShopManagement/PixelSize/UpdatePixelSizeRequest.php
  • app/Http/Requests/ShopManagement/PrintSize/CreatePrintSizeRequest.php
  • app/Http/Requests/ShopManagement/PrintSize/DeletePrintSizeRequest.php
  • app/Http/Requests/ShopManagement/PrintSize/UpdatePrintSizeRequest.php
  • app/Http/Requests/ShopManagement/PurchasableAlbumRequest.php
  • app/Http/Requests/ShopManagement/PurchasablePhotoRequest.php
  • app/Http/Requests/ShopManagement/UpdatePurchasablePriceRequest.php
  • app/Http/Resources/Shop/CatalogueSizesResource.php
  • app/Http/Resources/Shop/EditablePurchasableResource.php
  • app/Http/Resources/Shop/OrderItemResource.php
  • app/Http/Resources/Shop/OrderResource.php
  • app/Http/Resources/Shop/PixelSizeResource.php
  • app/Http/Resources/Shop/PrintSizeResource.php
  • app/Http/Resources/Shop/PurchasablePixelSizeResource.php
  • app/Http/Resources/Shop/PurchasablePrintSizeResource.php
  • app/Listeners/OrderCompletedListener.php
  • app/Metadata/Cache/RouteCacheManager.php
  • app/Models/Order.php
  • app/Models/OrderItem.php
  • app/Models/PixelSize.php
  • app/Models/PrintSize.php
  • app/Models/Purchasable.php
  • app/Models/PurchasablePixelSize.php
  • app/Models/PurchasablePrintSize.php
  • database/factories/PixelSizeFactory.php
  • database/factories/PrintSizeFactory.php
  • database/factories/PurchasablePixelSizeFactory.php
  • database/factories/PurchasablePrintSizeFactory.php
  • database/migrations/2026_05_31_000001_create_print_sizes_table.php
  • database/migrations/2026_05_31_000002_create_pixel_sizes_table.php
  • database/migrations/2026_05_31_000003_create_purchasable_print_sizes_table.php
  • database/migrations/2026_05_31_000004_create_purchasable_pixel_sizes_table.php
  • database/migrations/2026_05_31_000005_extend_order_items_for_print.php
  • database/migrations/2026_05_31_000006_extend_orders_for_shipping.php
  • docs/specs/4-architecture/features/043-webshop-print-pixel-sizes/plan.md
  • docs/specs/4-architecture/features/043-webshop-print-pixel-sizes/spec.md
  • docs/specs/4-architecture/features/043-webshop-print-pixel-sizes/tasks.md
  • docs/specs/4-architecture/open-questions.md
  • docs/specs/4-architecture/roadmap.md
  • lang/ar/left-menu.php
  • lang/ar/webshop.php
  • lang/bg/left-menu.php
  • lang/bg/webshop.php
  • lang/cz/left-menu.php
  • lang/cz/webshop.php
  • lang/de/left-menu.php
  • lang/de/webshop.php
  • lang/el/left-menu.php
  • lang/el/webshop.php
  • lang/en/left-menu.php
  • lang/en/webshop.php
  • lang/es/left-menu.php
  • lang/es/webshop.php
  • lang/fa/left-menu.php
  • lang/fa/webshop.php
  • lang/fr/left-menu.php
  • lang/fr/webshop.php
  • lang/hu/left-menu.php
  • lang/hu/webshop.php
  • lang/it/left-menu.php
  • lang/it/webshop.php
  • lang/ja/left-menu.php
  • lang/ja/webshop.php
  • lang/nl/left-menu.php
  • lang/nl/webshop.php
  • lang/no/left-menu.php
  • lang/no/webshop.php
  • lang/pl/left-menu.php
  • lang/pl/webshop.php
  • lang/pt/left-menu.php
  • lang/pt/webshop.php
  • lang/ru/left-menu.php
  • lang/ru/webshop.php
  • lang/sk/left-menu.php
  • lang/sk/webshop.php
  • lang/sv/left-menu.php
  • lang/sv/webshop.php
  • lang/tr/left-menu.php
  • lang/tr/webshop.php
  • lang/vi/left-menu.php
  • lang/vi/webshop.php
  • lang/zh_CN/left-menu.php
  • lang/zh_CN/webshop.php
  • lang/zh_TW/left-menu.php
  • lang/zh_TW/webshop.php
  • phpstan.neon
  • resources/js/components/forms/album/AlbumPurchasable.vue
  • resources/js/components/forms/gallery-dialogs/BuyMeDialog.vue
  • resources/js/components/forms/shop-management/PixelSizeFormDialog.vue
  • resources/js/components/forms/shop-management/PixelSizePricesInput.vue
  • resources/js/components/forms/shop-management/PrintSizeFormDialog.vue
  • resources/js/components/forms/shop-management/PrintSizePricesInput.vue
  • resources/js/components/forms/shop-management/SizeDeleteDialog.vue
  • resources/js/components/webshop/InfoSection.vue
  • resources/js/components/webshop/OrderSummary.vue
  • resources/js/composables/album/buyMeActions.ts
  • resources/js/composables/checkout/useStepOne.ts
  • resources/js/composables/checkout/useStepTwo.ts
  • resources/js/composables/contextMenus/leftMenu.ts
  • resources/js/composables/useAdminTiles.ts
  • resources/js/lychee.d.ts
  • resources/js/router/routes.ts
  • resources/js/services/shop-management-service.ts
  • resources/js/services/webshop-service.ts
  • resources/js/stores/OrderManagement.ts
  • resources/js/views/admin/shop/PrintPixelSizesAdmin.vue
  • resources/js/views/webshop/BasketList.vue
  • resources/js/views/webshop/CheckoutPage.vue
  • resources/js/views/webshop/OrderDownload.vue
  • resources/sass/app.css
  • routes/api_v2_shop.php
  • routes/web_v2.php
  • tests/Unit/Actions/Db/OptimizeDbTest.php
  • tests/Unit/Actions/Db/OptimizeTablesTest.php
  • tests/Unit/Actions/Shop/CanProcessPaymentPrintTest.php
  • tests/Unit/Actions/Shop/OrderServiceAddSizeItemsTest.php
  • tests/Unit/Actions/Shop/PurchasableSyncSizesTest.php
  • tests/Unit/Enum/PurchasableLicenseTypeTest.php
  • tests/Webshop/BasketPrintPixelItemsTest.php
  • tests/Webshop/Checkout/CheckoutShippingAddressTest.php
  • tests/Webshop/OrderManagement/OrderShippingAddressDisplayTest.php
  • tests/Webshop/Purchasables/CatalogueSizesControllerTest.php
  • tests/Webshop/Purchasables/PixelSizeManagementControllerTest.php
  • tests/Webshop/Purchasables/PrintSizeManagementControllerTest.php
  • tests/Webshop/Purchasables/PurchasablePriceWithSizesTest.php
  • tests/Webshop/Purchasables/ShopManagementControllerTest.php

Comment thread app/Actions/Shop/PurchasableService.php
Comment thread app/Http/Controllers/Admin/PixelSizeManagementController.php
Comment thread app/Http/Requests/Basket/AddPixelItemRequest.php
Comment thread app/Http/Requests/Checkout/CreateSessionRequest.php Outdated
Comment thread app/Http/Requests/ShopManagement/PurchasableAlbumRequest.php
Comment thread resources/sass/app.css
Comment thread tests/Unit/Actions/Shop/CanProcessPaymentPrintTest.php
Comment thread tests/Unit/Actions/Shop/OrderServiceAddSizeItemsTest.php
Comment thread tests/Unit/Actions/Shop/PurchasableSyncSizesTest.php
Comment thread tests/Webshop/BasketPrintPixelItemsTest.php
@ildyria

ildyria commented Jun 11, 2026

Copy link
Copy Markdown
Member

@coderabbitai time for another review, fixed your findings.

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

@ildyria, thanks for the heads up! I'll kick off a fresh review now to check the updated changes.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@ildyria ildyria merged commit 7b28fdc into master Jun 11, 2026
46 checks passed
@ildyria ildyria deleted the copilot/feature-43-add-print-and-pixel-size-support branch June 11, 2026 21:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants